package com.leyou.user.controller;

import com.leyou.common.enums.ExceptionEnum;
import com.leyou.common.exception.LyException;
import com.leyou.user.dto.UserDTO;
import com.leyou.user.entity.TbUser;
import com.leyou.user.service.TbUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;

@RestController
public class UserController {

    /*
    * GET /check/{data}/{type}
    * */
    @Autowired
    private TbUserService userService;
    /**
     * 数据验证功能
     * @param data
     * @param type
     * @return
     */
    @GetMapping("/check/{data}/{type}")
    public ResponseEntity<Boolean> checkData(@PathVariable("data")String data,@PathVariable("type")Integer type){
        boolean check=userService.check(data,type);
        return  ResponseEntity.status(HttpStatus.NO_CONTENT).body(check);
    }


    @PostMapping("/code")
    public ResponseEntity<Void> sendCode(@RequestParam("phone") String phone){
        userService.sendCode(phone);
        return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
    }


    /*在注册时，前端传入的数据，在Controller层进行校验，
    * 采用 validator校验，@Valid注解表示，要校验这个对象中的所有字段
    *
    * 当验证了参数，如何设置返回验证的结果？
    * 采用 BindingResult
    * 我们在User参数后面跟一个BindingResult参数，
    * 不管校验是否通过，都会进入方法内部。如何判断校验是否通过呢？
  *BindingResult中会封装错误结果，我们通过result.hasErrors来判断是否有错误，
  * 然后通过result.getAllErrors();来获取全部的错误信息。
  *
  * result.hasErrors判断是否有错误
  * result.getAllErrors();获取全部的错误信息
    * */
    @PostMapping("/register")
    public ResponseEntity<Void>  registerUser(@Valid TbUser user, BindingResult result,@RequestParam("code") String code){

        if(result.hasErrors()){
            /*判断参数校验是否有错误：如果有错误，获取错误信息getDefaultMessage*/
            List<ObjectError> allErrors = result.getAllErrors();
            String ErrorMessage = allErrors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(","));
            /*抛出异常*/
            throw new LyException(400,ErrorMessage);
        }
        userService.registerUser(user,code);

        return ResponseEntity.status(HttpStatus.CREATED).build();
    }


    //GET /query
    /**
     * 根据用户名，密码查询用户
     * @param username 用户名
     * @param password 密码
     * @return
     */
    @GetMapping("/query")
    public ResponseEntity<UserDTO> queryUser(@RequestParam("username")String username,@RequestParam("password")String password){

         UserDTO  userDTO=userService.queryUser(username,password);

        return ResponseEntity.status(HttpStatus.OK).body(userDTO);

    }
}
